#include "msgQLib.h"
#include "taskLib.h"
#include "semLib.h"
#include <stdio.h>
#include <stdlib.h>
 
#include "tacheMiseEnCartonsImpression.h"
#include "tacheMiseEnPalette.h"
#include "tacheStockage.h"
#include "tacheTraitementCommandes.h"
#include "tacheTraitementErreurs.h"
#include "tacheTraitementMessages.h"
#include "VxServer.h"
#include "config.h"
#include "string.h"

//structure regroupant tous les paramï¿½tres globaux
int EtatParametres; //TODO



int main()
{
	int idMiseEnCarton, idSimulationArriveePieces, idMiseEnPalette, idStockage, idTraitementCommandes, idTraitementErreurs, idTraitementMessages, idVxServer;
	MSG_Q_ID idBalErreurs, idBalCartons, idBalPalettes, idBalCommandes, idBalLogs, idBalIHM, idBalLots;
	SEM_ID idSemCartons;
	SEM_ID idSemClapet;
	SEM_ID idSemTaillePalette;
	MESSAGE_IHM messageLancementProduction;
	PALETTE testPalette;
	int tauxErreurMaximalLot //taux d'erreur maximal tolere pour le lot courant, en pourcentage
	int taillePiece[2];
	int i ;
	
	// Initialisation des tableaux de palettes
	
	for(i=0; i<MAX_PALETTES ; i++)
	{
		paletteTypeA[i] = NULL;
		paletteTypeB[i] = NULL;
	}
	
	
	
	printf("Demarrage du programme...\n");
	//Initialisation des var globales--------------
	//pannePalette = 0;
	
	// Creation de la BAL IHM  et BAL Commandes afin d'attendre le lancement de la production
	idBalIHM = msgQCreate(99,sizeof(MESSAGE_IHM),MSG_Q_PRIORITY); //les messages d'erreurs sont plus prioritaires
	if(idBalIHM == NULL)
	{
		printf("Erreur lors de la creation de BalIHM !\n");
		return -1;
	}

	idBalCommandes = msgQCreate(99, sizeof(MESSAGE_IHM), MSG_Q_FIFO);
	if(idBalCommandes == NULL)
	{
		printf("Erreur lors de la creation de BalCommandes !\n");
		return -1;
	}


	// Lancement de la tache VxServer
	idVxServer = taskSpawn("VxServer", 129, 0, 20000, (FUNCPTR)tcpServer, (int) idBalIHM, (int) idBalCommandes,0,0,0,0,0,0,0,0);
	if(idVxServer == ERROR)
	{
		printf("Erreur lors de la creation de VxServer !\n");
		return -1;
	}
	
	// on attend le message lancement de production : wait sur BAL commande
	msgQReceive(idBalCommandes, (char *) &messageLancementProduction, sizeof(MESSAGE_IHM), WAIT_FOREVER);
	while(messageLancementProduction.type != MESSIHM_INFORMATION || messageLancementProduction.typeObjet != 0 || strcmp(messageLancementProduction.message,"demarrage") != 0)
	{
		printf("ATTENTION : le message de l'ihm n'est pas un lancement de production : le message sera ignore.\n");
		msgQReceive(idBalCommandes, (char *) &messageLancementProduction, sizeof(MESSAGE_IHM), WAIT_FOREVER);
	}
	
	printf("Lancement de la production...\n");
	
	//Creation des ressources partagees ------------------------------------------------------------------
	
	printf("Creation des ressources partagees...");
	idSemCartons = semBCreate(SEM_Q_PRIORITY,SEM_FULL);
	if(idSemCartons == NULL)
	{
		printf("Erreur lors de la creation de semCartons !\n");
		return -1;
	}	
	printf("...");
	
	idBalErreurs = msgQCreate(99,sizeof(MESSAGE_LOG_ERR),MSG_Q_FIFO); //voir nbr max messages et longueur max messages
	if(idBalErreurs == NULL)
	{
		printf("Erreur lors de la creation de BalErreurs !\n");
		return -1;
	}
	printf("...");
	
	idBalCartons = msgQCreate(99,sizeof(CARTON),MSG_Q_FIFO); //voir nbr max messages et longueur max messages
	if(idBalCartons == NULL)
	{
		printf("Erreur lors de la creation de BalCartons !\n");
		return -1;
	}
	printf("...");
	
	idBalPalettes = msgQCreate(99,sizeof(PALETTE),MSG_Q_FIFO); //voir nbr max messages et longueur max messages
	if(idBalPalettes == NULL)
	{
		printf("Erreur lors de la creation de BalPalettes !\n");
		return -1;
	}
	printf("...");
	
	idBalLogs = msgQCreate(99,sizeof(MESSAGE_LOG_ERR),MSG_Q_FIFO); //voir nbr max messages et longueur max messages
	if(idBalLogs == NULL)
	{
		printf("Erreur lors de la creation de BalLogs !\n");
		return -1;
	}
	printf("...");
	
	idBalIHM = msgQCreate(99,120,MSG_Q_PRIORITY); //les messages d'erreurs sont plus prioritaires
	if(idBalIHM == NULL)
	{
		printf("Erreur lors de la creation de BalIHM !\n");
		return -1;
	}
	printf("...");
	
	idBalLots = msgQCreate(99,sizeof(MESSAGE_LOT),MSG_Q_PRIORITY); //les messages d'erreurs sont plus prioritaires
	if(idBalLots == NULL)
	{
		printf("Erreur lors de la creation de BalLots !\n");
		return -1;
	}
	printf("...");
	
	idSemClapet = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
	idSemTaillePalette = semBCreate(SEM_Q_FIFO, SEM_FULL);
	printf("OK\n");
	//Fin Creation des ressources partagees --------------------------------------------------------------
	
	
	//Creation des taches --------------------------------------------------------------------------------
	
	idMiseEnCarton = taskSpawn("MiseEnCarton",125,0,20000,(FUNCPTR)MiseEnCarton,(int)idBalLots,(int)idBalCartons,(int)idBalErreurs,(int)idSemCartons,(int)idSemClapet,0,0,0,0,0);
	if(idMiseEnCarton == ERROR)
	{
		printf("Erreur lors de la creation de MiseEnCarton !\n");
		return -1;
	}
		
	
	idMiseEnPalette = taskSpawn("MiseEnPalette",110,0,20000,(FUNCPTR)MiseEnPalette,(int) idBalPalettes,(int) idBalErreurs,(int) idBalLogs,(int) idBalCartons, (int) idBalIHM, (int) idSemClapet, (int) idSemTaillePalette,0,0,0);
	if(idMiseEnPalette == ERROR)
	{
		printf("Erreur lors de la creation de MiseEnPalette !\n");
		return -1;
	}
	
	idStockage = taskSpawn("Stockage",127,0,20000,(FUNCPTR)Stockage,(int)idBalPalettes,(int)idBalLogs,(int)idBalIHM,(int) idBalErreurs,0,0,0,0,0,0);
	if(idStockage == ERROR)
	{
		printf("Erreur lors de la creation de Stockage !\n");
		return -1;
	}
	
	idTraitementCommandes = taskSpawn("TraitementCommandes",126,0,20000,(FUNCPTR)TraitementCommandes,(int)idBalLogs,(int)idBalIHM,(int)idBalErreurs,(int)idBalCommandes,0,0,0,0,0,0);
	if(idTraitementCommandes == ERROR)
	{
		printf("Erreur lors de la creation de TraitementCommandes !\n");
		return -1;
	}
	
	idTraitementErreurs = taskSpawn("TraitementErreurs",130,0,20000,(FUNCPTR)TraitementErreurs,(int) idBalErreurs,(int) idBalIHM,(int) idBalLogs,0,0,0,0,0,0,0);
	if(idTraitementErreurs == ERROR)
	{
		printf("Erreur lors de la creation de TraitementErreurs !\n");
		return -1;
	}
	
	idTraitementMessages = taskSpawn("TraitementMessages",124,0,20000,(FUNCPTR)TraitementMessages, (int) idBalLogs, (int) idBalIHM,0,0,0,0,0,0,0,0);
	if(idTraitementMessages == ERROR)
	{
		printf("Erreur lors de la creation de TraitementMessages !\n");
		return -1;
	}
	
	
	
	
	idSimulationArriveePieces = taskSpawn("SimulationArriveePieces",110,0,20000,(FUNCPTR)MiseEnCarton,(int)taillePiece,(int)idMiseEnCarton,(int)idSemClapet,0,0,0,0,0,0,0);
	if(idSimulationArriveePieces == ERROR)
	{
			printf("Erreur lors de la creation de SimulationArriveePieces !\n");
			return -1;
	}
	
	//Fin Creation des taches ----------------------------------------------------------------------------
	
	return 0;
}
